每日一问:你了解 Java 虚拟机结构么?
最近都没有早上发过文章,今天试试早上发,看看效果。后面好固定一个时间段进行推文。
对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new
操作去写配对的 delete/free
代码。而对于我们 Android 乃至 Java 程序员,却总是会因为虚拟机的自动内存管理机制而忽视内存管理的重要性。
经过前面简短的几篇纯 Android 问题,我想再给大家掺杂一点可能平时你并没有太多关注的东西。其实写这个的时候我相当纠结,因为对于大多数 Android 开发来说,他们会更加注重实质性的技能提升,而不是我今天将要讲的 Java 虚拟机结构。
但经过一系列的思想斗争,我还是打算把这个讲到底,为了不浪费大家太多的时间,我依然遵从「每日一问」系列的初衷,我们尽可能地精简文字,让每一个小知识点阅读时间都控制在 5 分钟以下。
Java 虚拟机结构作为一个面试高频考点,你完全可以当做你在复习面试知识,这样兴许你的学习的心态会好一些。
我还是不得不去网上摘下了这个图,我想唯有用这张图结合讲解起来才更加的通俗易懂。
Java 虚拟机内存区域确实就由这几部分构成:方法区、虚拟机栈、本地方法栈、堆、程序计数器。
程序计数器
程序计数器是一个较小的内存空间,线程私有,它是唯一一个在 Java 虚拟机规范中没有规定任何 OOM 情况的区域。
虚拟机栈
虚拟机栈和程序计数器一样,同样为线程所私有,并且生命周期和线程相同。。每个栈中的数据都是私有的,其他栈不允许访问,每个方法被执行的时候都会同时创建一个栈帧,每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈从入栈到出栈的过程。虚拟机栈主要存放各种编译期可知的基本数据类型和对象的引用。
本地方法栈
本地方法栈与虚拟机栈发挥的作用非常相似,其主要区别是虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地房发展则是为虚拟机用到的 Native 方法服务。
Java 堆
Java 堆是垃圾收集器管理的主要区域,主要用于存放对象的实例,自然而然就成了 Java 虚拟机中管理内存最大的一块,并且它可以处于物理上不连续的内存空间中,Java 堆在虚拟机启动的时候就进行创建,并被所有线程所共享。
方法区
方法区和 Java 堆一样,是各个线程共享的内存区域,主要存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的回收和对类型的写在,较少发生垃圾收集行为。
上面对 Java 虚拟机结构进行了非常精简的讲解,大家可还对此清晰了一些?如果还是没有太透彻其实没有关系,多回顾几遍,最好能自己画一个图,在一边进行理解。明天我们再来讲一讲我们另外一个面试非常高频的考点:垃圾回收算法,一起来探究 Java 虚拟机到底是怎么来回收一个无用的对象的。
—————END—————
我是南尘,只做比心的公众号,欢迎关注我。
推荐阅读:
欢迎关注南尘的公众号:nanchen
做不完的开源,写不完的矫情,只做比心的公众号,如果你喜欢,你可以选择分享给大家。如果你有好的文章,欢迎投稿,让我们一起来分享。